home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 10 - 1994 / 10.09 Sep 94 / More Dylan / movie-view.dylan < prev    next >
Encoding:
Text File  |  1994-09-21  |  8.1 KB  |  279 lines  |  [TEXT/ttxt]

  1. // source container: movie-view.dylan
  2.  
  3. define class <movie-view> (<view>)
  4.   slot movie :: <Movie>,
  5.      init-value: as(<Movie>, 0),
  6.      init-keyword: movie:;                
  7.   slot show-mc?,
  8.      init-value: #t,
  9.      init-keyword: show-mc?:;
  10.   slot enable-editing?,
  11.      init-value: #t,
  12.      init-keyword: enable-editing?:;
  13.   
  14.   slot is-playing?,
  15.      init-value: #f;
  16.   slot loop?,
  17.      init-value: #f;
  18.   slot mc :: <MovieController>,
  19.      init-value: as(<MovieController>, 0);
  20. end class;
  21.  
  22. // called as each instance of <movie-view> is instantiated
  23. define method initialize (view :: <movie-view>, #key)
  24.   next-method();
  25.   
  26.   unless (nil?(view.movie))
  27.     set-movie-to-view(view, view.movie);
  28.   end unless;
  29.   
  30. end method;
  31.  
  32. // when a movie is closed, we need to clean up the relevant structures
  33. define method dispose (view :: <movie-view>)
  34.   
  35.   stop-playing(view);
  36.   
  37.   unless (nil?(view.movie))
  38.     unless(nil?(view.mc))
  39.       *controller-list* := remove!(*controller-list*,view.mc);
  40.       DisposeMovieController(as(<ComponentInstance>,view.mc));
  41.       view.mc := as(<MovieController>, 0);
  42.     end unless;
  43.     DisposeMovie(view.movie);
  44.     view.movie := as(<Movie>, 0);
  45.   end unless;
  46.   
  47.   next-method();
  48. end method;
  49.  
  50. // this informs the movie about the size of the window it will play inside
  51. // of on screen and intializes the GWorld of the movie to be the current one
  52. define method size-setter (view :: <movie-view>,  new-size :: <point>)
  53.   next-method();
  54.   
  55.   unless (nil?(view.movie))
  56.     with-stack-structure(r(<qd-rect>),
  57.                          begin
  58.                            focus(view);                                   
  59.                            //    Set the movie to play in our view
  60.                                    set-rect(r, view.local-bounds);
  61.                                    SetMovieBox(view.movie, r);
  62.                            SetMovieGWorld(view.movie, as(<CGrafPort>, 0), 
  63. as(<GDHandle>,0));
  64.                                    
  65.                          end);
  66.   end unless;
  67. end method;
  68.  
  69. define method start-playing (view :: <movie-view>)
  70.   unless (nil?(view.movie))
  71.     if (view.is-playing?)
  72.       stop-playing(view);
  73.     end if;
  74.     
  75.     GoToBeginningOfMovie(view.movie);
  76.     
  77.     //    Start the movie playing
  78.         StartMovie(view.movie);
  79.     
  80.     //    Mark that we are playing
  81.         view.is-playing? := #t;
  82.     end unless;
  83.   end method;
  84.  
  85. define method stop-playing (view :: <movie-view>)
  86.   unless (nil?(view.movie) | ~ view.is-playing?)
  87.         StopMovie(view.movie);
  88.         view.is-playing? := #f;
  89.   end unless;
  90. end method;
  91.  
  92. // this is called in response to an update event (the engine that calls it is 
  93. // embedded within the Framework
  94. define method draw (view :: <movie-view>,
  95.                     draw-rect :: <rect>)
  96.   ignore(draw-rect);
  97.  
  98.   unless (nil?(view.movie))
  99.     SetMovieActive(view.movie, #t);  
  100.     UpdateMovie(view.movie);
  101.     MoviesTask(view.movie, $doTheRightThing);
  102.   end unless;
  103.   
  104.   unless (~view.show-mc? | nil?(view.mc))
  105.     MCDraw(view.mc, get-window(view).window-ptr); 
  106.   end unless;
  107.  
  108. end method;
  109.  
  110. //sets up a view onto the movie in the window that is to contain the movie
  111. define method set-movie-to-view (view :: <movie-view>,
  112.                                  new-movie :: <Movie>)
  113.   
  114.   unless (new-movie = view.movie)
  115.     unless (nil?(view.movie))
  116.       unless(nil?(view.mc))
  117.         DisposeMovieController(view.mc);
  118.       end unless;
  119.       DisposeMovie(view.movie);   
  120.     end unless;
  121.     
  122.     view.movie := new-movie;
  123.     
  124.     with-stack-structure(view-rect(<qd-rect>),
  125.                          begin
  126.                            set-rect(view-rect, view.local-bounds);
  127.                            
  128.                            let movie-window = get-window(view);
  129.                            let movie-port = as(<CGrafPort>, movie-window.window-
  130. ptr);
  131.                            
  132.                            SetMovieGWorld(view.movie, movie-port, 
  133. as(<GDHandle>,0));
  134.                            SetMovieBox(view.movie, view-rect);
  135.                            
  136.                            if (view.show-mc?)
  137.                              view.mc := 
  138.                                 as(<MovieController>,
  139.                                    NewMovieController(view.movie, view-rect, 
  140. $mcTopLeftMovie));
  141.                              unless (nil?(view.mc))
  142.                                MCSetControllerBoundsRect(view.mc, view-rect);
  143.                                MCSetControllerPort(view.mc, movie-port);
  144.                                draw(view, view.local-bounds);
  145.                                *controller-list* := add!(*controller-list*, view.mc);
  146.                                if (view.enable-editing?)
  147.                                  MCEnableEditing(view.mc, #t);
  148.                                end if;
  149.                              end unless;
  150.                            end if;
  151.                          end);
  152.   end unless;
  153. end method;
  154.  
  155. // called while waiting for the events to occur (during idle time)
  156. define method do-idle (view :: <movie-view>)
  157.   
  158.   if (view.mc & view.show-mc)
  159.     // hack to have null events sent to the event loop during idle time
  160.     //  next version of the Framework will take care of this
  161.     
  162.     with-stack-structure(event-record(<EventRecord>),
  163.                          begin
  164.                            event-record.EventRecord$what := 0;
  165.                            GetMouse(event-record.EventRecord$where);
  166.                            event-record.EventRecord$when := TickCount();
  167.                            event-record.EventRecord$message := 0;
  168.                            event-record.EventRecord$modifiers := #x80;
  169.                            MCIsPlayerEvent(view.mc, event-record);
  170.                          end);
  171.   else
  172.     
  173.     if (view.is-playing?)
  174.       MoviesTask(view.movie, $doTheRightThing);
  175.       if (IsMovieDone(view.movie))
  176.         stop-playing(view);
  177.       end if;
  178.       
  179.     end if;
  180.   end if;
  181. end method;
  182.  
  183. // The  following methods are menu callbacks that suport editing 
  184. //functionality of the movie
  185. // controller
  186.  
  187. define method do-event (view :: <movie-view>,
  188.                  event :: <menu-event>,
  189.                  id == #"clear")
  190.   
  191.   ignore(event, id);
  192.   unless(nil?(view.mc))
  193.     MCClear(view.mc);
  194.   end unless;
  195. end method;
  196.  
  197. define method do-event (view :: <movie-view>,
  198.                  event :: <menu-event>,
  199.                  id == #"undo")
  200.   
  201.   ignore(event, id);
  202.   unless(nil?(view.mc))
  203.     MCUndo(view.mc);
  204.   end unless;
  205. end method;
  206.  
  207. define method do-event (view :: <movie-view>,
  208.                  event :: <menu-event>,
  209.                  id == #"copy")
  210.   
  211.   ignore(event, id);
  212.   unless(nil?(view.mc))
  213.     let selection = MCCopy(view.mc);
  214.     unless(nil?(selection))
  215.       PutMovieOnScrap(selection, $movieScrapOnlyPutMovie);
  216.       DisposeMovie(selection);
  217.          end unless;
  218.   end unless;
  219. end method;
  220.  
  221.  
  222. define method do-event (view :: <movie-view>,
  223.                  event :: <menu-event>,
  224.                  id == #"cut")
  225.   
  226.   ignore(event, id);
  227.   unless(nil?(view.mc))
  228.     let selection = MCCut(view.mc);
  229.     unless(nil?(selection))
  230.       PutMovieOnScrap(selection, $movieScrapOnlyPutMovie);
  231.       DisposeMovie(selection);
  232.     end unless;
  233.   end unless;
  234. end method;
  235.  
  236. define method do-event (view :: <movie-view>,
  237.                  event :: <menu-event>,
  238.                  id == #"paste")
  239.   
  240.   ignore(event, id);
  241.   unless(nil?(view.mc) | ~IsScrapMovie(as(<Track>,0)))
  242.     MCPaste(view.mc, as(<Movie>,0));
  243.   end unless;
  244.   end method;
  245.  
  246. // this method highlights the menus correctly
  247. define method do-setup-menus (view :: <movie-view>)
  248.   next-method();
  249.   
  250.   unless(nil?(view.mc) | ~view.enable-editing? | ~view.show-mc | 
  251. nil?(view.movie)) 
  252.     enable-item(#"copy");
  253.     MCSetUpEditMenu(view.mc, $doTheRightThing, as(<MenuHandle>,*edit-
  254. menu*.toolbox-menu));
  255.   end unless;       
  256.   
  257. end method;
  258.  
  259. define method do-event (view :: <movie-view>, 
  260.                         event :: <generic-mouse-down-event>, 
  261.                         id :: <keyword>)
  262.   // when controller not present:
  263.   // double-click to play, single-click to stop
  264.   
  265.   ignore(id);
  266.   if (~view.show-mc | nil?(view.mc))
  267.     if (double-click? (event))
  268.       if (IsMovieDone(view.movie))
  269.         GoToBeginningOfMovie(view.movie);
  270.       end if;
  271.       start-playing(view);
  272.     else
  273.       stop-playing(view);
  274.       next-method();
  275.     end if;
  276.   else
  277.     next-method();
  278.   end if;
  279. end method;